package com.iwuyc.tools.commons.system;

import com.iwuyc.tools.commons.util.string.StringUtils;
import lombok.extern.slf4j.Slf4j;


/**
 * 环境变量工具类
 *
 * @author Neil
 * @since 2024-06-01
 */
@Slf4j
public class SystemEnvUtil {
    private SystemEnvUtil() {
    }

    /**
     * 获取系统属性
     *
     * @param envKey       系统属性
     * @param defaultValue 默认值
     * @param quiet        是否静默，如果是静默，则不抛出异常，只会打印日志
     * @return 属性值，如果获取失败，则是默认值
     */
    public static String getEnv(String envKey, String defaultValue, boolean quiet) {

        try {
            final String result = System.getenv(envKey);
            return StringUtils.isNotBlank(result) ? result : defaultValue;
        } catch (Exception e) {
            if (!quiet) {
                throw e;
            }
            log.info("获取环境变量失败，key:{},defaultValue:{}", envKey, defaultValue);
            return defaultValue;
        }

    }

    /**
     * 获取系统属性
     *
     * @param propertyName 系统属性
     * @param defaultValue 默认值
     * @param quiet        是否静默，如果是静默，则不抛出异常，只会打印日志
     * @return 属性值，如果获取失败，则是默认值
     */
    public static String getProperty(String propertyName, String defaultValue, boolean quiet) {

        try {
            return System.getProperty(propertyName, defaultValue);
        } catch (Exception e) {
            if (!quiet) {
                throw e;
            }
            log.info("获取系统属性失败，key:{},defaultValue:{}", propertyName, defaultValue);
            return defaultValue;
        }
    }

    /**
     * 从系统属性或系统环境变量中获取值
     *
     * @param propertyName 系统属性
     * @param defaultValue 默认值
     * @param quiet        是否静默，如果是静默，则不抛出异常，只会打印日志
     * @return 属性值，如果获取失败，则是默认值
     */
    public static String get(String propertyName, String defaultValue, boolean quiet) {
        final String result = getProperty(propertyName, null, quiet);
        if (StringUtils.isNotBlank(result)) {
            return result;
        }
        return getEnv(propertyName, defaultValue, quiet);
    }

    /**
     * 通过系统属性key的枚举，从系统属性或系统环境变量中获取值
     *
     * @param key          枚举
     * @param defaultValue 默认值
     * @param quiet        静默，如果是静默，则不抛出异常，只会打印日志
     * @return 属性值，如果获取失败，则是默认值
     */
    public static String get(SystemEnvKey key, String defaultValue, boolean quiet) {
        return get(key.getKey(), defaultValue, quiet);
    }

    /**
     * 通过系统属性key的枚举，从系统属性或系统环境变量中获取值
     *
     * @param key 枚举
     * @return 属性值，如果获取失败，则返回空字符串
     */
    public static String get(SystemEnvKey key) {
        return get(key.getKey(), "", true);
    }
}
